; usa funciones del archivo c-lisp.lsp... pero no importa ya que estan en memoria..

(defun convertToLisp (expr &optional (ops nil) (vars nil))
	(cond
		((null expr) (armarExpresionFinal ops vars))
		((esOpLisp (car expr))
			(if (> (length ops) 0)
				(if (< (getPrioridadOp (car expr)) (getPrioridadOp (car ops)))
					(convertToLisp (cdr expr) (cons (car expr)(cdr ops)) 
						(cons (list (car ops) (cadr vars) (car vars)) (cddr vars) )
					)
					(convertToLisp (cdr expr) (cons (car expr) ops) vars)
				)
				(convertToLisp (cdr expr) (cons (car expr) ops) vars)
			)
		)
         	((atom (car expr)) (convertToLisp (cdr expr) ops (cons (car expr) vars)))
         	(T (convertToLisp (cdr expr) ops (cons (car (convertToLisp (car expr))) vars)))
       )    
)

(defun armarExpresionFinal (ops vars)
    (if (null ops) vars
        (armarExpresionFinal (cdr ops) (cons (list (car ops) (cadr vars) (car vars)) (cddr vars)))
    )
)


(defun esOpLisp (op)
    (cond 
        ((equal op '+) T)
        ((equal op '-) T)
        ((equal op '*) T)
        ((equal op '/) T)
        ((equal op '<) T)
        ((equal op '>) T)
        ((equal op '<=) T)
        ((equal op '>=) T)
        ((equal op 'eq) T)
        ((equal op 'and) T)
        ((equal op 'or) T)
        ( T nil)
    )
)

(defun getPrioridadOp (op)
    (cond
        ((equal op '*)  3)
        ((equal op '/)  3)
        ((equal op '+)  2)
        ((equal op '-)  2)
        ( T 1)
    )
)
